package proceso.busqueda;

import modelo.red.Atributo;
import modelo.red.Malla;
import modelo.red.Pixel;

import org.hibernate.Query;
import org.hibernate.Session;

/**
 * 
 * @author edgar
 * Clase para buscar valores de interpolacion en una malla.
 * parametros de entrada para la busqueda.
 * nombre de la malla, atributo a buscar, norte y este
 * los valores recuperados estan en valor
 */
public class RecuperarPunto {
	private double norte;
	private double este;
	private double valor;
	private boolean error;
	private Malla malla;
	private Pixel pixel = null;
	private Atributo atributo;
	private String razon = "";
	
	public double getNorte() {
		return norte;
	}
	public void setNorte(double norte) {
		this.norte = norte;
	}
	public double getEste() {
		return este;
	}
	public void setEste(double este) {
		this.este = este;
	}
	public double getValor() {
		return valor;
	}
	public void setValor(double valor) {
		this.valor = valor;
	}
	public boolean isError() {
		return error;
	}
	public void setError(boolean error) {
		this.error = error;
	}
	public String getRazon() {
		return razon;
	}
	public void setRazon(String razon) {
		this.razon = razon;
	}
	
	public boolean atributoUnico(Session sess, String nombreMalla, double este, double norte) {
		boolean existeMalla = false;
		boolean resultado;
		this.este = este;
		this.norte = norte;
		
		Query q;
		q = sess.createQuery("from Malla as m where m.nombre like :nombreMalla");
		q.setParameter("nombreMalla",nombreMalla);
		existeMalla = false;
		if(q.list().size() == 1) {
			malla = (Malla) q.list().get(0);
			existeMalla = true;
		}
		else {
			razon = "La malla " + nombreMalla + " no existe";
			return false;
		}
		if(malla.getListaAtributo().size()!=1) {
			razon = "La malla tiene varios atributos.";
			return false;
		}
		atributo = malla.getListaAtributo().get(0).getAtributo();
		pixel = malla.validarPunto(norte, este);
		if(pixel == null) {
			razon = "El punto esta fuera del rango de la malla";
			return false;
		}
		pixel.setAtributo(malla.getListaAtributo().get(0));
		

		
		resultado = pixel.calcularPuntos(sess);
		if(!resultado){
			razon = pixel.getError();
		}
		else {
			valor = pixel.getValorPunto();
		}
		return resultado;
	}
	
	
	public boolean recuperarPunto(Session sess, String nombreMalla, String nombreAtributo, double este, double norte) {
		boolean existeMalla = false;
		boolean resultado;
		this.este = este;
		this.norte = norte;
		
		Query q;
		q = sess.createQuery("from Malla as m where m.nombre like :nombreMalla");
		q.setParameter("nombreMalla",nombreMalla);

		existeMalla = false;
		if(q.list().size() == 1) {
			malla = (Malla) q.list().get(0);
			existeMalla = true;
		}
		else {
			razon = "La malla " + nombreMalla + " no existe";
			System.out.println(razon);
			return false;
		}
		boolean atributoEncontrado = false;
		int posicion = -1;
		for(int i=0; i< malla.getListaAtributo().size(); i++) {
			if(nombreAtributo.compareTo(malla.getListaAtributo().get(i).getAtributo().getNombre()) == 0) {
				atributoEncontrado = true;
				posicion = i;
			}
		}
		if(!atributoEncontrado) {
			razon = "El atributo no existe para la malla";
			System.out.println(razon);
			return false;
		}

		atributo = malla.getListaAtributo().get(posicion).getAtributo();
		pixel = malla.validarPunto(norte, este);
		if(pixel == null) {
			razon = "El punto esta fuera del rango de la malla";
			return false;
		}
		
		pixel.setAtributo(malla.getListaAtributo().get(posicion));
		
		resultado = pixel.calcularPuntos(sess);

		if(!resultado){
			razon = pixel.getError();
		}
		else {
			valor = pixel.getValorPunto();
		}
		return resultado;
	}
}
